import numpy as np
#样本的数据来源方向为自旋转光束与涡旋光束相互调节研究领域
# 样本[m,a,n,l]分别表示幂指数参数、振幅参数、自旋转光束数量n，涡旋光束拓扑核数l
data = np.array([[2, 200, 2, -2],
                   [2, 200, -2, -3],
                   [2, 200, 2, -4]])
# 数据中心化
average = np.mean(data, axis=0)
element= data - average
print("特征均值")
for i, m in enumerate(average):
    print(f"特征均值{i+1} : {m:.4f}")
print()
print("中心化数据")
for i, point in enumerate(element):
    print(f"数据{i+1}: {point}")
print()
# 协方差矩阵
C = np.cov(element.T)
print("协方差矩阵")
print(C)
print()
# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(C)
print("特征值")
for i, val in enumerate(eigenvalues):
    print(f"特征值 {i+1}: {val:.4f}")
print()
print("特征向量")
for i in range(eigenvectors.shape[1]):
    print(f"特征向量 {i+1}: {eigenvectors[:, i]}")
print()
# 选择大值代表特征向量
idx = eigenvalues.argsort()[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]
W = eigenvectors[:, :2]
# 主成分投影
projections = element @ W
# 显示主成分投影结果
print("主成分投影结果")
for i, proj in enumerate(projections):
    print(f"数据点 {i+1} 的投影: {proj}")
print()
# 计算方差解释率和累计信息保留率
all_eigenvalues = np.sum(eigenvalues)
variance_ratios = eigenvalues / all_eigenvalues
cumulative_variance = np.cumsum(variance_ratios)
# 显示方差解释率
print("各主成分的方差解释率")
for i, ratio in enumerate(variance_ratios):
    print(f"主成分 {i+1}: {ratio:.4f} = {ratio*100:.2f}%")
print()
# 显示累计信息保留率
print("累计信息保留率")
for i, cum_ratio in enumerate(cumulative_variance):
    print(f"保留前 {i+1} 个主成分: {cum_ratio*100:.2f}%")
